|
Arduino Nano R3 |
x 1 | |
|
SG90 Micro-servo motor |
x 1 | |
|
Ultrasonic Sensor - HC-SR04 |
x 1 | |
|
TFT display 240 x 320 ILI9341 driver chip |
x 1 | |
|
Resistor, 2.2 kohm |
x 5 | |
|
Resistor, 3.3 kohm |
x 5 |
|
Soldering Iron Kit |
|
|
arduino IDEArduino
|
DIY Arduino ultrasonic Sonar - Radar on TFT display
Ultrasonic sonar is devices that use sound waves with frequencies higher than the upper audible limit of human hearing (typically above 20 kHz) to measure distances to objects. They work on the principle of sending out a sound wave, and then measuring the time it takes for the sound wave to bounce back after hitting an object. By calculating the time difference between sending and receiving the sound wave, the distance to the object can be determined using the speed of sound in air. In some of my previous videos, you can see several different builds of such a device with special functionalities. All of them display the result on a PC monitor using an additional program written in the Processing application.
This time I will describe to you a simple way how to make an independent Sonar, where the results are displayed on a TFT color display in the form of a radar image, which is why it is often mistakenly called radar instead of sonar.
I got the idea quite by accident from a picture on the internet, and then after a little research I found that project on Github. The original project was made on a 1.8 inch display which is really a very small surface for this purpose. So I reworked the code for a larger 3.2 inch TFT display, where the image is much clearer.
The device is really simple to make and consists of only a few components
- Arduino Nano microcontroller board
- TFT display with a resolution of 240 x 320 pixels and an ILI9341 driver chip
- Ultrasonic sensor type HC-SR04
- small 9G Servo
- and several resistors that serve to shift the display signal from 5V to 3.3V level
The servo and ultrasonic sensor are housed in a separate box, which I used from a previous project, and connected to the main box with flat cables.
Now let's see how the device works in real conditions:
At the beginning, I separated the ultrasonic sensor from the servo in order to calibrate the graphic presentation with the real distance of the object. As you can see, the real distance fully corresponds to the distance shown on the display.
Now we mount the sensor on the servo and place the obstacles to be detected. At power on, the servo is tested first, then the Radar like screen is drawn on the display and scanning begins.
Obstacles are marked with red dots. In the lower left corner, the scanning area is displayed, and on the right, the distance between the sensor and the obstacle in centimeters. The three green arcs with marked distances serve us for easier visibility and an idea of the real distance. If the nearest obstacle is greater than 1 meter, yellow dots are drawn on the last arc, indicating an out of range condition. Scanning is performed first from 180 to 0 degrees, and then vice versa, from 0 to 180 degrees.
For the sake of stability during operation, the device is preferably powered by an external power source, but it also works via USB on the Arduino. All display colors can be easily changed in the code according to the user's preference.
And finally a short conclusion. Most such devices show the scan result on a PC monitor which requires an additional application and code. This is a very simple, easy to make, visually effective, and self-contained device intended for both beginners and more advanced DIYers. I've used cases from previous projects, but it's desirable to have it all in one case with a slanted front display to visually simulate a real radar system.
#include <Servo.h>
#include <SPI.h>
#include "Ucglib.h"
#define trigPin 6
#define echoPin 5
#define ServoPin 3
int Ymax = 240;
int Xmax = 320;
int Xcent = Xmax / 2;
int base = 210;
int scanline = 185;
Servo baseServo;
//Ucglib_ILI9341_18x240x320_SWSPI ucg(/*sclk=*/ 13, /*data=*/ 11, /*cd=*/ 9, /*cs=*/ 10, /*reset=*/ 8);
Ucglib_ILI9341_18x240x320_HWSPI ucg(/*cd=*/ 9, /*cs=*/ 10, /*reset=*/ 8);
void setup(void)
{
ucg.begin(UCG_FONT_MODE_SOLID);
ucg.setRotate90();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(115200);
baseServo.attach(ServoPin);
ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT);
ucg.setColor(0, 0, 100, 0);
ucg.setColor(1, 0, 100, 0);
ucg.setColor(2, 20, 20,20);
ucg.setColor(3, 20, 20, 20);
ucg.drawGradientBox(0, 0, 320, 240);
ucg.setPrintDir(0);
ucg.setColor(0, 5, 0);
ucg.setPrintPos(70,120);
ucg.setFont(ucg_font_logisoso32_tf);
ucg.print("Mini Radar");
ucg.setColor(0, 255, 0);
ucg.setPrintPos(70,120);
ucg.print("Mini Radar");
ucg.setFont(ucg_font_courB14_tf);
ucg.setColor(20, 255, 20);
ucg.setPrintPos(90,200);
ucg.print("Testing...");
baseServo.write(90);
for(int x=0;x<180;x+=5)
{ baseServo.write(x);
delay(50);
}
ucg.print("OK!");
delay(500);
ucg.setColor(0,0, 0, 0);
ucg.setColor(1,0, 0, 0);
ucg.setColor(2,0, 0, 0);
ucg.setColor(3,0, 0, 0);
ucg.drawGradientBox(0, 0, 320, 240);
delay(10);
//ucg.clearScreen();
cls();
ucg.setFontMode(UCG_FONT_MODE_SOLID);
ucg.setFont(ucg_font_helvR08_hr); // or freedoomr10_tr
}
void cls()
{
ucg.setColor(0, 0, 0, 0);
for(int s=0;s<240;s++)
{
ucg.drawHLine(0,s,320);
delay(1);
}
//ucg.drawBox(0, 0, 160, 60);
}
int calculateDistance()
{
long duration;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
return duration*0.034/2;
}
void fix_font()
{
ucg.setColor(0, 180, 0);
ucg.setPrintPos(144,44);
ucg.print("1.00");
ucg.setPrintPos(144,100);
ucg.print("0.60");
ucg.setPrintPos(144,165);
ucg.print("0.30");
}
void fix()
{
ucg.setColor(0, 180, 0);
ucg.drawDisc(Xcent, base+1, 3, UCG_DRAW_ALL);
ucg.drawCircle(Xcent, base+1, 210, UCG_DRAW_UPPER_LEFT);
ucg.drawCircle(Xcent, base+1, 210, UCG_DRAW_UPPER_RIGHT);
ucg.drawCircle(Xcent, base+1, 135, UCG_DRAW_UPPER_LEFT);
ucg.drawCircle(Xcent, base+1, 135, UCG_DRAW_UPPER_RIGHT);
ucg.drawCircle(Xcent, base+1, 70, UCG_DRAW_UPPER_LEFT);
ucg.drawCircle(Xcent, base+1, 70, UCG_DRAW_UPPER_RIGHT);
ucg.drawLine(0, base+1, Xmax,base+1);
ucg.setColor(0, 180, 0);
for(int i= 40;i < 300; i+=2)
{
if (i % 10 == 0)
ucg.drawLine(185*cos(radians(i))+Xcent,base - 185*sin(radians(i)) , 205*cos(radians(i))+Xcent,base - 205*sin(radians(i)));
else
ucg.drawLine(195*cos(radians(i))+Xcent,base - 195*sin(radians(i)) , 205*cos(radians(i))+Xcent,base - 205*sin(radians(i)));
}
ucg.setColor(0,200,0);
ucg.drawLine(0,0,0,36);
for(int i= 0;i < 5; i++)
{
ucg.setColor(0,random(200)+50,0);
ucg.drawBox(2,i*8,random(28)+3,6);
}
ucg.setColor(0,180,0);
ucg.drawFrame(292,0,28,28);
ucg.setColor(0,60,0);
ucg.drawHLine(296,0,20);
ucg.drawVLine(292,4,20);
ucg.drawHLine(296,52,20);
ucg.drawVLine(318,4,20);
ucg.setColor(0,220,0);
ucg.drawBox(296,4,8,8);
ucg.drawBox(296,16,8,8);
ucg.drawBox(308,16,8,8);
ucg.setColor(0,100,0);
ucg.drawBox(308,4,8,8);
ucg.setColor(0,90,0);
ucg.drawTetragon(124,220,116,230,196,230,204,220);
ucg.setColor(0,160,0);
ucg.drawTetragon(134,220,126,230,186,230,194,220);
ucg.setColor(0,210,0);
ucg.drawTetragon(144,220,136,230,176,230,184,220);
}
void loop(void)
{
int distance;
fix();
fix_font();
for (int x=180; x > 4; x-=2){
baseServo.write(x);
int f = x - 4;
ucg.setColor(0, 255, 0);
ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f)));
f+=2;
ucg.setColor(0, 128, 0);
ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f)));
f+=2;
ucg.setColor(0, 0, 0);
ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f)));
ucg.setColor(0,200, 0);
distance = calculateDistance();
if (distance < 100)
{
ucg.setColor(255,0,0);
ucg.drawDisc(2.2*distance*cos(radians(x))+ Xcent,-2.2*distance*sin(radians(x))+base, 1, UCG_DRAW_ALL);
}
else
{
ucg.setColor(255,255,0);
ucg.drawDisc(208*cos(radians(x))+Xcent,-208*sin(radians(x))+base, 1, UCG_DRAW_ALL);
}
Serial.print(x);
Serial.print(" , ");
Serial.println(distance);
if (x > 70 and x < 110) fix_font();
ucg.setColor(255,255, 0);
ucg.setPrintPos(20,230);
ucg.print("DEG: ");
ucg.setPrintPos(54,230);
ucg.print(x);
ucg.print(" ");
ucg.setPrintPos(240,230);
ucg.print(" ");
ucg.print(distance);
ucg.print(" cm ");
}
//ucg.clearScreen();
delay(50);
cls();
fix();
fix_font();
for (int x=1; x < 176; x+=2){
baseServo.write(x);
int f = x + 4;
ucg.setColor(0, 255, 0);
ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f)));
f-=2;
ucg.setColor(0, 128, 0);
ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f)));
f-=2;
ucg.setColor(0, 0, 0);
ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f)));
ucg.setColor(0, 200, 0);
distance = calculateDistance();
if (distance < 100)
{
ucg.setColor(255,0,0);
ucg.drawDisc(2.2*distance*cos(radians(x))+Xcent,-2.2*distance*sin(radians(x))+base, 1, UCG_DRAW_ALL);
}
else
{
ucg.setColor(255,255,0);
ucg.drawDisc(208*cos(radians(x))+Xcent,-208*sin(radians(x))+base, 1, UCG_DRAW_ALL);
}
Serial.print(x);
Serial.print(" , ");
Serial.println(distance);
if (x > 70 and x < 110) fix_font();
ucg.setColor(255,255, 0);
ucg.setPrintPos(20,230);
ucg.print("DEG: ");
ucg.setPrintPos(54,230);
ucg.print(x);
ucg.print(" ");
ucg.setPrintPos(240,230);
ucg.print(" ");
ucg.print(distance);
ucg.print(" cm ");
}
//ucg.clearScreen(); //
delay(50);
cls();
}
DIY Arduino ultrasonic Sonar - Radar on TFT display
- Comments(0)
- Likes(0)
- 0 USER VOTES
- YOUR VOTE 0.00 0.00
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
More by Mirko Pavleski
- DIY Arduino Morse code Decoder and Trainer The Morse Code is a language that people use to communicate with each other through telegraph, radi...
- Dual MOT (microwave oven transformer) Tesla Coil Tesla coils are known for their ability to generate visually impressive electrical arcs or sparks, ...
- ESP2866 controlled 8x32 matrix WS2812 Leds (Awtrix project) The WS2812B is a individually addressable RGB LED that allows you to control each LED's color and b...
- How to make simplest possible autorange Capacitance meter The capacity measurement option is usually only available in more expensive multimeters, so it is d...
- How to turn mini Tesla Coil from Aliexpress into a Real Powerful SSTC with big spark Some time ago I bought a mini tesla coil kit from an online store that cost less than $4. It's a ve...
- DIY Arduino ultrasonic Sonar - Radar on TFT display Ultrasonic sonar is devices that use sound waves with frequencies higher than the upper audible lim...
- Simple ESP32 Internet radio on VFD Display Internet radio, also known as online radio or streaming radio, refers to the broadcasting of audio ...
- Short review of small music Tesla Coil with Bluetooth A Solid State Tesla Coil (SSTC) is a type of Tesla coil that uses solid-state electronic components...
- Testing 2500W Large Induction Heater An induction heater is a device that uses electromagnetic induction to heat objects. It consists of...
- Arduino FFT Audio Spectrum analyzer on 8x32 color matrix WS2812B The spectrum analyzer displays the amplitude of signals as a function of frequency, allowing engine...
- Unusual Led Ring Arduino Clock, Temperature, and Humidity meter There are many arduino clock projects with temperature and humidity readings where the results are ...
- How to make simple portable PEMF Magnetic Pulser PEMF (Pulsed Electromagnetic Field Therapy), which is also known as magnetic pulse therapy uses ele...
- Single Mosfet Mini SSTC Tesla coil with 10 + cm Spark A Solid State Tesla Coil (SSTC) is a type of Tesla coil that uses solid-state components such as tr...
- How to Make EM84 (6E2) Vacuum Tube Stereo VU Meter A VU meter, also known as a Volume Unit meter, is a device used to display the audio signal level ...
- Universal Arduino Staccato controller for SSTC and VTCC Tesla Coils The VTTC Staccato Controller was developed in the attempt to create longer sparks from VTTCs while ...
- DIY extremly Sensitive and cheap Arduino Seismometer A seismometer, is an instrument used to detect and record ground motion caused by seismic waves, su...
- DIY Extremly Sensitive and cheap Geophone sensor for Earthquakes detecting A geophone is a device used in geophysics to detect ground movement. It is specifically designed to...
- Arduino FFT Spectrum analyzer on VFD display GP1287 An audio spectrum analyzer is a device that visualizes the frequency content of an audio signal. It...
-
Robot with WiFi control and servos driven by ESP32
10 0 0 -
Commodore 1551 Drive Cartridge Replacement
156 0 2 -
RCMHardwareByte-v2.3
111 0 0 -
Terminal Curiosity PCB Ruler
329 0 1 -
(DIY) COMMODORE 64 DEAD-TEST (781220) DIAGNOSTIC CARTRIDGE
370 0 2 -
Creative Micro Designs Inc. CMD FD-2000 / FD-4000 3D Printable Case
404 0 0 -
Creative Micro Designs Inc. CMD FD-2000 / FD-4000 Metal Case
578 0 0 -